下文
192.168.200.129、requirepass 123456等仅为课堂示例,生产环境请改为强密码、最小权限与本机可达地址;Redis 5+ 推荐用REPLICAOF host port(SLAVEOF为兼容别名)。
作用
读写分离,性能扩展,降低主服务器的压力容灾,快速恢复,主机挂掉时,从机变为主机
一主两从配置
shell
# 以下为在配置文件中指定主从关系(除此之外还有另一种通过命令执行主从关系)
# 一主两从配置
客户端
主(端口:6379)
从1(端口:6380) 从2(端口:6381)
# 创建 /opt/master-slave 工作目录
mkdir /opt/master-slave
# 创建配置文件
touch /opt/master-slave/redis.conf # 内容为 redis.conf 默认配置
# 创建 主(端口:6389)配置文件,在/opt/master-slave 目录创建 redis-6389.conf 文件,内容如下:
include /opt/master-slave/redis.conf # redis.conf是redis原配置文件,内部包含了很多默认的配置,这里使用include将其引用,相当于把 redis.conf内容直接贴进来了
daemonize yes
bind 192.168.200.129
requirepass 123456 # 配置密码
dir /opt/master-slave/
logfile /opt/master-slave/6379.log
port 6379
dbfilename dump_6379.rdb
pidfile /var/run/redis_6379.pid
# 创建 从1(端口:6380)配置文件,在/opt/master-slave 目录创建 redis-6380.conf 文件,内容如下:
include /opt/master-slave/redis.conf
daemonize yes
bind 192.168.200.129
requirepass 123456
dir /opt/master-slave/
port 6380
dbfilename dump_6380.rdb
pidfile /var/run/redis_6380.pid
logfile /opt/master-slave/6380.log
slaveof 192.168.200.129 6379 # 用来指定主机:slaveof 主机ip 端口
masterauth 123456 # 主机的密码
# 创建 从2(端口:6381)配置文件,在/opt/master-slave 目录创建 redis-6381.conf 文件,内容如下:
include /opt/master-slave/redis.conf
daemonize yes
bind 192.168.200.129
requirepass 123456
dir /opt/master-slave/
port 6381
dbfilename dump_6381.rdb
pidfile /var/run/redis_6381.pid
logfile /opt/master-slave/6381.log
slaveof 192.168.200.129 6379 # 用来指定主机:slaveof 主机ip 端口
masterauth 123456 # 主机的密码
# 先关闭所有 redis
ps -ef | grep redis | awk -F" " '{print $2;}' | xargs kill -9
# 再启动 一主二从 redis 数据库
redis-server /opt/master-slave/redis-6379.conf
redis-server /opt/master-slave/redis-6380.conf
redis-server /opt/master-slave/redis-6381.conf
# 查看主机信息(会显示主从 redis 数据库信息)
redis-cli -h 192.168.200.129 -p 6379 -a 123456
info Replication
# 查看子机信息(会显示主从 redis 数据库信息)
redis-cli -h 192.168.200.129 -p 6380 -a 123456
info Replication
# 验证
## 写入主
redis-cli -h 192.168.200.129 -p 6379 -a 123456
flushdb
set name alias
set age 18
## 读取从
redis-cli -h 192.168.200.129 -p 6380 -a 123456
mget name age
## 查看主从复制信息
info Replication
# 原理
slave启动成功连接到master后,会给master发送数据同步消息(发送sync命令)
master接收到slave发来的数据同步消息后,把主服务器的数据进行持久化到rdb文件,同时会收集
接收到的用于修改数据的命令,master将传rdb文件发送给你slave,完成一次完全同步
全量复制:而slave服务在接收到master发来的rdb文件后,将其存盘并加载到内存
增量复制:master继续将收集到的修改命令依次传给slave,完成同步
但是只要重新连接master,一次完全同步(全量复制)将会被自动执行
# 问题和解决方案
1. 主redis挂掉以后情况会如何?从机是上位还是原地待命?
主机挂掉后,从机会待命,小弟还是小弟,会等着大哥恢复,不会篡位。
2. 从挂掉后又恢复了,会继续从主同步数据么?
会的,当从重启之后,会继续将中间缺失的数据同步过来。一主多从
shell
# 一主多从:若 主机 下面挂很多 子机,主机会有压力,实际上 子机 下面也可以挂 子机,
客户端
主(端口:6379)
从1(端口:6380) 从2(端口:6381) # 主 -> 从 1 ,主 -> 从 2
从3(端口:6382) 从4(端口:6383) # 从 1 -> 从 3 ,从 2 -> 从 4哨兵模式配置
- 原理
shell
# 原理
能够自动监控master是否发生故障,如果故障了会根据投票数从slave中挑选一个,作为master,其他的slave会自动转向同步新的master,实现故障自动转移。
sentinel会按照指定的频率给master发送ping请求,看看master是否还活着,若master在指定时间内未
正常响应sentinel发送的ping请求,sentinel则认为master挂掉了,但是这种情况存在误判的可能,比
如:可能master并没有挂,只是sentinel和master之间的网络不通导致,导致ping失败。
为了避免误判,通常会启动多个sentinel,一般是奇数个,比如3个,那么可以指定当有多个sentinel都
觉得master挂掉了,此时才断定master真的挂掉了,通常这个值设置为sentinel的一半,比如sentinel
的数量是3个,那么这个量就可以设置为2个。
当多个sentinel经过判定,断定master确实挂掉了,接下来sentinel会进行故障转移:会从slave中投票
选出一个服务器,将其升级为新的主服务器, 并让失效主服务器的其他从服务器slaveof指向新的主服务
器; 当客户端试图连接失效的主服务器时, 集群也会向客户端返回新主服务器的地址, 使得集群可以
使用新主服务器代替失效服务器。- 配置1主2从3个哨兵
shell
# 1主2从3个哨兵: 当从的挂掉之后,要求最少有2个哨兵认为主的挂掉了,才进行故障转移。
客户端
哨兵(端口:26379) 哨兵(端口:26380) 哨兵(端口:26381)
主(端口:6379)
从1(端口:6380) 从2(端口:6381)
# 步骤
## 创建 /opt/sentinel 工作目录
mkdir /opt/sentinel
## 创建配置文件
touch /opt/sentinel/redis.conf # 内容为 redis.conf 默认配置
## 创建 主(端口:6379)配置文件,在/opt/sentinel目录创建 redis-6379.conf 文件,内容如下:
include /opt/sentinel/redis.conf
daemonize yes
bind 192.168.200.129
dir /opt/sentinel/
port 6379
dbfilename dump_6379.rdb
pidfile /var/run/redis_6379.pid
logfile "./6379.log"
## 创建 子1(端口:6380)配置文件,在/opt/sentinel目录创建 redis-6380.conf 文件,内容如下:
include /opt/sentinel/redis.conf
daemonize yes
bind 192.168.200.129
dir /opt/sentinel/
port 6380
dbfilename dump_6380.rdb
pidfile /var/run/redis_6380.pid
logfile "./6380.log"
## 创建 子2(端口:6381)配置文件,在/opt/sentinel目录创建 redis-6381.conf 文件,内容如下:
include /opt/sentinel/redis.conf
daemonize yes
bind 192.168.200.129
dir /opt/sentinel/
port 6381
dbfilename dump_6381.rdb
pidfile /var/run/redis_6381.pid
logfile "./6381.log"
## 启动 主、子1、子2服务
redis-server /opt/sentinel/redis-6379.conf
redis-server /opt/sentinel/redis-6380.conf
redis-server /opt/sentinel/redis-6381.conf
## 配置子1为主的从库
redis-cli -h 192.168.200.129 -p 6380 # 连接
slaveof 192.168.200.129 6379 # 配置
info replication ## 查看主从信息
## 配置子2为主的从库
redis-cli -h 192.168.200.129 -p 6381 # 连接
slaveof 192.168.200.129 6379 # 配置
info replication ## 查看主从信息
## 验证
redis-cli -h 192.168.200.129 -p 6379
info replication
flushdb
set name alias
get name
## 创建 哨兵1(端口:26379)配置文件,在/opt/sentinel目录创建 sentinel-26379.conf 文件,内容如下:
dir /opt/sentinel/ # 配置文件目录
logfile "./sentinel-26379.log" # 日志文件位置
pidfile /var/run/sentinel_26379.pid # pid文件
daemonize yes # 是否后台运行
port 26379 # 端口
sentinel monitor mymaster 192.168.200.129 6379 2 # 监控主服务器master的名字:mymaster,IP:192.168.200.129,port:6379,最后的数字2表示当Sentinel集群中有2个Sentinel认为master存在故障不可用,则进行自动故障转移
sentinel down-after-milliseconds mymaster 60000 # 主观下线:连续 60000ms 无有效回复则标记 sdown(注释里「20 秒」为笔误,以本配置为准)
sentinel failover-timeout mymaster 180000 # 故障转移超时时间(毫秒),如果3分钟内没有完成故障转移操作,则视为转移失败
sentinel parallel-syncs mymaster 1 # 故障转移之后,进行新的主从复制,配置项指定了最多有多少个slave对新的master进行同步,那可以理解为1是串行复制,大于1是并行复制
sentinel auth-pass mymaster 123456 # 指定mymaster主的密码(没有就不指定)
## 创建 哨兵2(端口:26380)配置文件,在/opt/sentinel目录创建 sentinel-26380.conf 文件,内容如下:
dir /opt/sentinel/ # 配置文件目录
logfile "./sentinel-26380.log" # 日志文件位置
pidfile /var/run/sentinel_26380.pid # pid文件
daemonize yes # 是否后台运行
port 26380 # 端口
sentinel monitor mymaster 192.168.200.129 6379 2 # 监控主服务器master的名字:mymaster,IP:192.168.200.129,port:6379,最后的数字2表示当 Sentinel集群中有2个Sentinel认为master存在故障不可用,则进行自动故障转移
sentinel down-after-milliseconds mymaster 60000 # 主观下线:60000ms 内无有效回复则标记 sdown(勿与注释里的「20 秒」混淆)
sentinel failover-timeout mymaster 180000 # 故障转移超时时间(毫秒),如果3分钟内没有完成故障转移操作,则视为转移失败
sentinel parallel-syncs mymaster 1 # 故障转移之后,进行新的主从复制,配置项指定了最多有多少个slave对新的master进行同步,那可以理解为1是串行复制,大于1是并行复制
sentinel auth-pass mymaster 123456 # 指定mymaster主的密码(没有就不指定)
## 创建 哨兵3(端口:26381)配置文件,在/opt/sentinel目录创建 sentinel-26381.conf 文件,内容如下:
dir /opt/sentinel/ # 配置文件目录
logfile "./sentinel-26381.log" # 日志文件位置
pidfile /var/run/sentinel_26381.pid # pid文件
daemonize yes # 是否后台运行
port 26381 # 端口
sentinel monitor mymaster 192.168.200.129 6379 2 # 监控主服务器master的名字:mymaster,IP:192.168.200.129,port:6379,最后的数字2表示当 Sentinel集群中有2个Sentinel认为master存在故障不可用,则进行自动故障转移
sentinel down-after-milliseconds mymaster 60000 # 主观下线:60000ms 内无有效回复则标记 sdown(勿与注释里的「20 秒」混淆)
sentinel failover-timeout mymaster 180000 # 故障转移超时时间(毫秒),如果3分钟内没有完成故障转移操作,则视为转移失败
sentinel parallel-syncs mymaster 1 # 故障转移之后,进行新的主从复制,配置项指定了最多有多少个slave对新的master进行同步,那可以理解为1是串行复制,大于1是并行复制
sentinel auth-pass mymaster 123456 # 指定mymaster主的密码(没有就不指定)
## 启动哨兵
/opt/redis-6.2.1/src/redis-sentinel /opt/sentinel/sentinel-26379.conf
/opt/redis-6.2.1/src/redis-sentinel /opt/sentinel/sentinel-26380.conf
/opt/redis-6.2.1/src/redis-sentinel /opt/sentinel/sentinel-26381.conf
## 查看哨兵
redis-cli -p 26379
info sentinel
## 验证
redis-cli -h 192.168.200.129 -p 6379
shutdown # 哨兵配置文件中 down-after-milliseconds 的值是60秒,表示判断主机下线时间是60秒,所以我们等2分钟,让系统先自动完成故障转移。
redis-cli -h 192.168.200.129 -p 6380
info replication # 查看从 1 的主从信息:子2变成主,且子2变成子1的从库,完成了故障转移。
set msg hello
get msg
# 当旧的 master 恢复之后,会自动挂在新的 master 下面
redis-server /opt/sentinel/redis-6379.conf
redis-cli -h 192.168.200.129 -p 6379
info replication